package com.cysd.ewmksbs.ksb_utils

import android.graphics.Bitmap
import android.widget.Toast
import androidx.annotation.WorkerThread
import com.google.zxing.*
import com.google.zxing.common.HybridBinarizer
import java.util.*

/**
 * ZXing 图片解码工具类
 */
object ZXingImageDecoder {

    // 默认支持的格式（二维码 + 常用条形码）
    private val DEFAULT_FORMATS = listOf(
        BarcodeFormat.QR_CODE,
        BarcodeFormat.CODE_128,
        BarcodeFormat.EAN_13,
        BarcodeFormat.UPC_A,
        BarcodeFormat.CODE_39
    )

    /**
     * 解码图片中的条形码/二维码
     * @param bitmap 待解码的图片
     * @param formats 指定支持的格式（默认支持二维码和主流条形码）
     * @param tryHarder 是否启用增强识别模式（更耗时但更准确）
     * @return 解码结果文本，失败返回null
     */

    @WorkerThread
    fun decode(
        bitmap: Bitmap,
        formats: List<BarcodeFormat> = DEFAULT_FORMATS,
        tryHarder: Boolean = true
    ): String? {
        return try {
            // 1. 将Bitmap转换为ZXing可处理的格式
            val pixels = IntArray(bitmap.width * bitmap.height)
            bitmap.getPixels(pixels, 0, bitmap.width, 0, 0, bitmap.width, bitmap.height)
            val source = RGBLuminanceSource(bitmap.width, bitmap.height, pixels)
            val binaryBitmap = BinaryBitmap(HybridBinarizer(source))

            // 2. 配置解码参数
            val hints = EnumMap<DecodeHintType, Any>(DecodeHintType::class.java).apply {
                put(DecodeHintType.POSSIBLE_FORMATS, formats)
                if (tryHarder) put(DecodeHintType.TRY_HARDER, true)
            }

            // 3. 执行解码（这才是完全正确的写法）
            val reader = MultiFormatReader()
            reader.setHints(hints)
            val result: Result = reader.decode(binaryBitmap) // 明确获取Result对象
            result.text // 从Result对象获取文本内容

        } catch (e: NotFoundException) {
            null
        } catch (e: Exception) {
            null
        }
    }

    /**
     * 带UI反馈的解码（自动切换到主线程显示Toast）
     * @param context Context用于显示Toast
     */
    fun decodeWithUiFeedback(
        bitmap: Bitmap,
        context: android.content.Context,
        formats: List<BarcodeFormat> = DEFAULT_FORMATS,
        tryHarder: Boolean = true
    ) {
        val result = decode(bitmap, formats, tryHarder)
        android.os.Handler(context.mainLooper).post {
            if (result != null) {
                Toast.makeText(context, "识别成功: $result", Toast.LENGTH_LONG).show()
            } else {
                Toast.makeText(context, "未识别到二维码/条形码", Toast.LENGTH_SHORT).show()
            }
        }
    }
}